<?php

/**
 *
 * LRController
 * путь  - LR
 * Реализация логина-регистрации
 *  
 */
class LRController extends AbstractModule implements INameable, IObservable{

    private $observers;
    private $model;    
    public function __construct() {
         parent::__construct();
         $this->setActiveSubmodule('blocklr', 'leftblock');
         //добавляем слушателя messageobservedr, используется для прослушивания нойтисов и варнингов
         $this->addObserver($this->messagesobserver);
         $this->model = new LRModel();
         //разрешённые пути
         $this->setAllowedPaths(array(
            'login/%text%',
            'profile/%text%/%num%',
            'registration',
            'logout',
            'ajax/%num%',
         ));
    }
    public function index() {
        return false;
    }
    /**
     * путь LR/ajax
     * занимается ajax обработкой
     * возвращает ответ в виде json
     * @param type $operation
     * @return boolean 
     */
    public function ajax($operation) {
       //отключаем все сабмодули, они нам не нужны, так как нужна пустая страница для вывода json
       $this->disableAllSubmodules();
       //устанавливаем специальный шаблон для вывода json (он называется none)
       $this->pageunit->setTemplate('none');

       //свитчер выбора операции
        switch ($operation) {
            case 'checklogin':
                if(!$this->model->hasUserInBase(htmlspecialchars($_POST['user_login'])))
                {
                    $this->fireEvent('message', array('message'=>'Нет такого пользователя!'));
                }
                
                break;
            default:
                return false;
                break;
        }

        return true;
    }

    /**
     * Формирует название страницы в зависимости от указанного пути в $path
     * 
     * @param type $path
     * @return string 
     */
    public static function getPageName($path) 
    {     
        $args = array();
        //заменяем аргументы строки на %
        parent::preparePath($path, $args);
        switch ($path) {
          
            case 'lr/profile/show/%':
                $registry = Registry::getInstance();
                $model = new LRModel();
                //получаем данные о пользователе с айдишником из аргумента
                $data = $model->getUserDataById($args[1]);
                //если нет у него имени в базе, то он ноунейм. это временно конечно
                if(empty($data['realname'])) $data['realname'] = 'NONAME';
                return str_replace('%user', $data['realname'], 'Профайл пользователя %user');
            case 'lr/profile':
                return 'профайл';
            return;
            case 'Lr':
                return 'Пользователи';
            return;
                default:
                break;
        }
    }
    /**
     * Путь LR/login/%
     * производит авторизацю пользователя
     * @return boolean 
     */
    public function login() {
        
            //если уже залогинен -> иди на главную страничку
            if ($this->user->isLogged) return $this->doAction($this->router->getAction('index'));

            $args = func_get_args();
            $current_stategy = @$args[0];

            //если не указана стратегия логина в аргементе, 404
            if (empty($current_stategy))
                return false;

            //добавляем обсервера
            $this->user->addObserver($this->messagesobserver);
            //подгружаем классы стратегии
            $this->load->library('LoginFabric');
            $this->load->library('LoginStrategy');
            try {
                $this->load->library($current_stategy . 'LoginStrategy');
            } catch (Exception $e) {
                return false;
            }
            //получаем ссылку на объект выбранной стратегии
            $strategy = LoginFabric::getLoginStrategy($current_stategy);
            //устанавливаем стратегию
            $this->user->setStrategy($strategy);

            //пробуем логиниться
            if($this->user->doLogin())
            {
                //перенаправляем на страницу профайла
                return $this->doAction($this->router->getAction('LR/profile'), array('edit', $this->user->user_id));
            }
            else
            {
                return $this->doAction($this->router->getAction('index'));
            }       
    }
    /**
     * Профайл пользователя
     * Путь LR/profile/%
     * @return boolean 
     */
    public function profile() {
        
        $args = func_get_args();

        $action = @$args[0];
        $user_id = @$args[1];
        //если некорректный айдишник юзера, 404
        if(!is_numeric($user_id) || $user_id<0) return false;
        //если не залогинен, 404
        if(!$this->user->isLogged) return false;
        if($action!='edit') $action = 'show';
        //если экшн edit, но это пройал не текущего юзера, то 404
        if($action == 'edit' && $user_id != $this->user->user_id)  return false;
        //такого юзера ващпе нет, 404
        if(!$this->model->hasUserInBaseById($user_id)) return false;
            //обрабатываем форму edit profile
            if (@$_POST['edit_profile'] && $user_id == $this->user->user_id) {
            //что-то проиходит, вроде профиль обновляется
                $this->fireEvent('message', array('message'=>'Заплатка!'));
            }
            //активируем сабмодули, если актион не редактирование
            if($action != "edit")
            {
            $this->setActiveSubmodule('comments', 'heap');
            $this->setActiveSubmodule('favoritesadder', 'heap');
            }
            
            $company = new CompanyModel();
            
            //получаем данные о юзере по id
            $data = $this->model->getUserDataByid($user_id);
            //смотрим есть ли у него компания
            $data['hascompany'] = $this->model->hasCompany($data['user_id']);
            if($data['hascompany'])
            $data['company'] = $company->getCompanyById($data['ownerof']);
            
            $pagedata = array();     
            if ($action == "edit") {
                $pagedata[] = array('data'=> LRView::editProfile($data), 'region'=>'heap');
            } else {
                $pagedata[] = array('data'=> LRView::getProfile($data, ($this->user->user_id == $data['user_id'])), 'region'=>'heap');
            }
            $this->output($pagedata);
            return true;
    }
    /**
     * Регистрация нового пользователя
     * Путь LR/registration
     * @return boolean 
     */
    public function registration() {
        if ($this->user->isLogged) return false;
        //получаем пользователя
        $user = $this->user;
        //добавляем обсервера
        $user->addObserver($this->messagesobserver);
        if ($user->registerUser()) {
            return $this->doAction($this->router->getAction('index'));
        }
        
        $pagedata = array();     
        $pagedata[] = array('data'=> LRView::getRegistrationForm(), 'region'=>'heap');
        $this->output($pagedata);
        
        return true;
    }
    /**
     * Выход юзера из системы
     * Путь LR/logout
     * @return type 
     */
    public function logout() {
        $user = $this->user;
        if($user->isLogged)
        {
        $user -> doLogout();
        }
        return $this->doAction($this->router->getAction('index'));
    }
    /**
     * Реализация интерфейса IObservable
     * @param type $eventType
     * @param type $data 
     */   
    public function fireEvent($eventType, $data) {

        if (is_array($this->observers)) {
            foreach ($this->observers as $objObserver) {
                $objObserver->notify($eventType, $data);
            }
        }
    }
    /**
    * Реализация интерфейса IObservable
    * @param type $eventType
    * @param type $data 
    */   
    public function addObserver(IObserver $obs) {
        $this->observers[] = $obs;
    }
    
    public function install()
    {
        
    }
    
    public function delete()
    {
        
    }
    
    public function hook_preaction() {
//            echo 'hook preaction was invoked in '.__CLASS__.' !<br>';
    }
    
     public function hook_postaction() {
//            echo 'hook postaction was invoked in '.__CLASS__.' !<br>';
    }
}
?>
